package de.tc.stammdatenverwaltung.functions;

import de.tc.stammdatenverwaltung.gui.Main;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Vector;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class commonFunctions {

  public static String LS = System.getProperty("line.separator");

  public static String[] columns = new String[]
    {
      "ID", "MAILAN", "TITEL", "VNAME", "NAME2", "NNAME", "NICK",
      "ANSCHRIFT", "PLZ_ORT", "TEL", "FAX", "MOBIL", "MAIL1", "MAIL2", "ABI2", "AEMTER",
      "VEREIN", "FIRMA", "RANG", "BERUF", "F_PLZ_ORT", "F_TEL", "F_FAX", "F_MAIL", "BDAY2",
      "ANREDE", "TAGFIELD", "F_ANSCHRIFT",
      //erweiterung wegen NachrichtHist
      "DATUM", "NACHRICHT", "ART", "EIN"
    };
  public static String[] columNames = new String[]
    {
      "#", "Mailen", "Titel", "Vorname", "2. Name", "Nachname", "Spitzname",
       "Anschrift", "PLZ + Ort", "Telefon", "Fax", "Mobil", "E-Mail 1", "E-Mail 2", "Abitur", "Ämter",
      "Verein", "Firma", "Rang", "Beruf", "Firma PLZ + Ort", "Firma Telefon", "Firma Fax", "Firma E-Mail", "Geburtstag",
      "Anrede", "Tag", "Firma Anschrift",
      //erweiterung wegen NachrichtHist
      "Datum", "Nachricht", "Art der Nachricht", "Ausgehend?"
    };
  public static String[] nachrichtArt = new String[] 
  {
    "nicht angegeben", "E-Mail", "Fax", "Telefonat", "Brief"
  };

  public static Vector<Integer> markedElement = new Vector<Integer>();
  public static Vector<Integer> markedMessage = new Vector<Integer>();

  public static void loggeMails(Vector<String> anWen, String mailInhalt)
  {
    //alle uebergebenen durchgehen und fuer jeden einzelnen ein insert machen
    //da wir hier nach Mail-Adressen filtern muessen wir drauf achten, dass evtl. auch 2 Kontakte 1 Adresse haben...
    // sollte aber egal sein, weil ja dann auch beide die Mail bekamen ...
    for (Iterator<String> it = anWen.iterator(); it.hasNext();)
    {
      //hier rein, damit wir nur ein statement brauchen
      Vector<String> inserts = new Vector<String>();
      
      String selectQ = "";
      String adresse = "";
      try
      {
        String adTemp = it.next();
        if (adTemp != null)
        {
          adresse = "'" + sqlSichern( adTemp ) + "'";
          selectQ = "Select ID from STAMMDATEN where MAIL1 = " + adresse + " or MAIL2 = " + adresse + " or F_MAIL = " + adresse;

          Statement stmt = Main.con.createStatement();
          ResultSet rs = stmt.executeQuery( selectQ );

          //ergebnis zu DIESER mailadresse durchgehen
          while ( rs.next() )
          {
            inserts.add( "insert into KONTAKTHISTORIE ( IDKONTAKT, ART, NACHRICHT) " +
              "values ( " + rs.getString("ID") + ", 1, '" + sqlSichern(mailInhalt) + "' )" );
          }//while
        }//if != null
      }//mailadressen durchgehen
      catch (Exception e)
      {
        JOptionPane.showMessageDialog(null, "Fehler beim abfragen der Kontakte zur Adresse " + adresse + ". Fehler:\r\n" +
         e.getLocalizedMessage(), "Fehler!", 1);
         e.printStackTrace();
         System.out.println(selectQ);
      }

      String insertQ = "";
      for (Iterator<String> it1 = inserts.iterator(); it1.hasNext();)
      {
        try
        {
          insertQ = it1.next();
          Statement insStmt = Main.con.createStatement();
          insStmt.executeUpdate(insertQ);
          insStmt.close();
        }
        catch (Exception e1)
        {
          JOptionPane.showMessageDialog(null, "Das erstellen des History-Eintrags für " + adresse +
            "ist fehlgeschlagen.Fehler:\r\n" + e1.getLocalizedMessage(), "Fehler!", 1);
          e1.printStackTrace();
          System.out.println(insertQ);
        }
      }//inserts durchgehen
    }
  }

  public static Object[] vectorToArray(Vector v)
  {
    Object[] ar = new Object[v.size()];
    for (int i=0; i < v.size(); i++)
    {
      ar[i] = v.get(i);
    }
    return ar;
  }

  public static boolean inArray(int value, int[] array)
  {
    for (int i = 0; i < array.length; i++)
      if (array[i] == value)
        return true;
    return false;
  }

  public static boolean inArray(String value, String[] array)
  {
    for (int i = 0; i < array.length; i++)
      if ( array[i].equals(value) )
        return true;
    return false;
  }

  synchronized public static void load_query_to_table(String SQL, JTable table, DefaultTableModel tm)
  {
    ResultSet MyRs = null;
    try
    {
      Statement stmt = Main.con.createStatement();
      MyRs = stmt.executeQuery(SQL);
    }
    catch (SQLException ex)
    {
      JOptionPane.showMessageDialog(null, "Beim Ausführen der Abfrage ist ein Fehler aufgetreten - Abfrage:\r\n” " +
        SQL + "\r\nFehler:\r\n" + ex.getLocalizedMessage(), "Fehler!", 1);
      ex.printStackTrace();
    }

    table = new JTable();
    table.setModel(tm);

    commonFunctions.putRSinTableModel(MyRs, tm);


    table.setModel(tm);
    table.doLayout();
    table.updateUI();
  }

  synchronized public static void putRSinTableModel(ResultSet rs, DefaultTableModel tm)
  {
    if (tm.getClass() == myMainTableModel.class)
      markedElement.clear(); //leer setzen ist wichtig!
    else
      markedMessage.clear();
    
    ResultSetMetaData rsmd = null;
    int clmCnt = -1;
    try
    {
      rsmd = rs.getMetaData();
      clmCnt = rsmd.getColumnCount();
    }
    catch (SQLException e)
    {
      e.printStackTrace();
    }

    if (rsmd == null || clmCnt == -1)
    {
      throw new RuntimeException("rsmd is null");
    }
    try
    {
      //Titel der Tabelle machen
      //ACHTUNG; habe jetz noch ne Tabelle (Kontakthistory), aber die geht mit dem Titel zummen noch gut
      
      //ACHTUNG: ID wird nicht angezeigt, darum clmCnt -1 und pos -2 und von 2 starten
      Vector clmHeaders = new Vector();

      //Object[] clmHeaders = new Object[clmCnt-1];
      for (int i = 2; i <= clmCnt; i++)
      {
        //cols.removeAllElements();
        String cName = rsmd.getColumnName(i);
        if ( !cName.equalsIgnoreCase("ID") && !cName.equalsIgnoreCase("VEREIN") &&
             !cName.equalsIgnoreCase("GEBURTSTAG") && !cName.equalsIgnoreCase("ABITUR") )
        {
          //cols.add(cName);
          int elPos = -1;
          for (int temp = 0; temp < columns.length; temp++)
          {
            if (columns[temp].equals(cName))
            {
              elPos = temp;
              break;
            }
          }

          if (elPos > -1)
            clmHeaders.add(columNames[elPos]);
          else
            clmHeaders.add(cName);
        }
      }

      Object[] clmHeadersAr = commonFunctions.vectorToArray(clmHeaders);

      //Daten fetchen
      Vector rows = new Vector();
      Vector rowData = null;

      int row = 0;
      while ( rs.next() )
      {
        rowData = new Vector();
        for (int i = 1; i <= clmCnt; i++)
        {
          //haupttable
          if (tm.getClass() == myMainTableModel.class)
          {
            //System.out.println(i + " " + rs.getString(i));
            //ID  MALAN,  bday, abi, verein
            int[] ignoreFields = new int[] {1, 2, 9, 18, 21};
            if ( ! inArray(i, ignoreFields) )
            {
              String fieldVal = rs.getString(i);
              rowData.add(fieldVal);
            }
            else if ( i == 1) //ID
              markedElement.add( row, rs.getInt(i) );
            else if ( i == 2) //MailAn
            {
              int y = rs.getInt(i);
              if ( y == 1)
                rowData.add(Boolean.TRUE);
              else
                rowData.add(Boolean.FALSE);
            }
          }//end haupttable
          else
          {
            if ( i == 1) //ID
              markedMessage.add( row, rs.getInt(i) );
            else if (i == 4) //Art => mappen
              rowData.add( nachrichtArt[rs.getInt(i)] );
            else if ( i == 5) //Eingehend
            {
              int y = rs.getInt(i);
              if ( y == 1)
                rowData.add(Boolean.TRUE);
              else
                rowData.add(Boolean.FALSE);
            }
            else
              rowData.add( rs.getString(i) );
          }
        }
        rows.add(rowData);
        row ++;
      }

      tm.setDataVector( rows, new Vector( Arrays.asList(clmHeadersAr) ) );
    }
    catch (SQLException e1)
    {
      e1.printStackTrace();
    }
  }

  public static boolean stringIsEmpty(String str)
  {
    if (str.isEmpty() || str.trim().isEmpty())
      return true;
    else
      return false;
  }

  public static String sqlSichern(String str)
  {
    String temp = new String(str);
    temp.replace( (CharSequence) "''", str);
    return temp;
  }

  public static String[] bdayFromString(String s)
  {
    SimpleDateFormat sdf = new SimpleDateFormat( "dd.MM.yyyy" );
    try
    {
      Date bdd = sdf.parse( s );
      return new String[] { sdf.format(bdd) };
    }
    catch (Exception e1)
    {
      //anders versuchen
      try
      {
        sdf = new SimpleDateFormat( "yyyy" );
        Date bdd = sdf.parse( s );
        return new String[] { "01.01." + sdf.format(bdd), "31.12." + sdf.format(bdd) };
      }
      catch (Exception e2)
      {
        System.out.println("Ignoriere Geburtstag , kein Datum uebergeben ...");
        return null;
      }
    }
  }

  public static boolean isValidMail( String s )
  {
    if ( (s != null) && ( s.length() > 0 ) && s.contains("@") && s.contains(".") )
      return true;
    return false;
  }

  synchronized public static String[] getAendHinz(int ID)
  {
    String [] ar = new String[2];
    try
    {
      Statement stmt = Main.con.createStatement();
      ResultSet rs = stmt.executeQuery(
        "select iif (geaendert is not null, F_GFORMATD('dd.mm.yyyy hh:nn:ss', geaendert), '') geaendert," +
        "iif (hinzugefuegt is not null, F_GFORMATD('dd.mm.yyyy hh:nn:ss', hinzugefuegt), '') hinzugefuegt " +
        "from stammdaten where id = " + ID);

      if (rs.isBeforeFirst())
        rs.next();

      ar[0] = rs.getString("GEAENDERT");
      ar[1] = rs.getString("HINZUGEFUEGT");
    }
    catch (Exception e)
    {
      JOptionPane.showMessageDialog(null, "Geändert- und Angelegt-Status konnte nicht ermittelt werden. Fehler:\r\n"
          + e.getLocalizedMessage(), "Fehler!", 1);
        e.printStackTrace();
        System.out.println("select geaendert, hinzugefuegt from stammdaten where id = " + ID);
    }
    return ar;
  }
}
